//
// Created by antler on 2018/12/15.
//

#ifndef LUA_XMOD_H
#define LUA_XMOD_H

#include <string>
#include <map>

#include "LuaJavaHelper.h"

#define CLASSNAME_XMOD "xmod"
#define USERTYPE_XMOD "xmod"

#define STRING_PROPERTY_LEN (256)

class XMod {
public:
    //    当前产品平台代号标识
    enum {
        PRODUCT_CODE_DEV = 1,
        PRODUCT_CODE_XXZS = 2,
        PRODUCT_CODE_IPA = 3,
        PRODUCT_CODE_KUWAN = 4,
        PRODUCT_CODE_SPIRIT = 5,
    };

    //    设置当触发了event事件时，回调到callback函数。目前支持的event取值是
    enum {
        EVENT_ON_USER_EXIT = 1,
        EVENT_ON_RUNTIME_ERROR = 2,
    };

    //    此项设置可选value值为xmod.SCREENCAP_POLICY_STANDARD（默认设置，标准模式）或xmod.SCREENCAP_POLICY_AGGRESSIVE（激进模式），
    //    其中默认的STANDARD模式为保证引擎运行流畅，有内置的截图缓存机制（四分之一秒内的重复截图请求会沿用最近一次截图）。
    //    开发者可以根据需要设置成AGGRESSIVE模式，此模式下每次找色/比色/获取颜色等都会触发实时截图，相应的对CPU压力会更大，不建议在IPA精灵等运行平台下开启。
    enum {
        SCREENCAP_POLICY_STANDARD = 0,
        SCREENCAP_POLICY_AGGRESSIVE = 1,
    };

    static const char *PLATFORM_IOS;
    static const char *PLATFORM_ANDROID;

    // 设置引擎属性，目前key仅支持以下值
    static const char *EXPECTED_ORIENTATION;
    static const char *SCREENCAP_POLICY;
    static const char *SCREENCAP_KEEP;

protected:
    union Variable {
        int nVal;
        bool bVal;
        char szVal[STRING_PROPERTY_LEN];
    };

    using CONFIG_MAP = std::map<std::string, Variable>;

    using EVENT_MAP = std::map<int, int>;

public:
    static XMod *getInstance();

    static void releaseInstance();

    XMod();

    ~XMod();

    // 当前系统平台标识
    const char *getPlatform();

    // 当前产品平台代号标识
    int getProductCode();

    //  当前产品平台代号名称
    const char *getProductName();

    // 当前脚本引擎版本号
    int getVersionCode();

    // 当前脚本引擎版本名
    const char *getVersionName();

    // 获取引擎属性
    bool getConfig_Bool(const std::string &key, bool def);

    // 设置引擎属性
    void setConfig_Bool(const std::string &key, bool value);

    int getConfig_Int(const std::string &key, int def);

    void setConfig_Int(const std::string &key, int value);

    std::string getConfig_String(const std::string &key, const std::string &def);

    void setConfig_String(const std::string &key, const std::string &value);

    // 获取引擎公共目录
    std::string getPublicPath();

    // 获取脚本私有目录
    std::string getPrivatePath();

    // 目录转换
    std::string resolvePath(const std::string &path);

    // 设置事件回调
    //    设置当触发了event事件时，回调到callback函数。目前支持的event取值是：
    //    xmod.EVENT_ON_USER_EXIT
    //            监听用户主动停止脚本的回调处理。注意由于脚本回调callback后即将结束，请勿在callback函数里做耗时过长的处理。
    //    xmod.EVENT_ON_RUNTIME_ERROR
    //            监听脚本运行时错误的回调处理，回调函数包含错误详细信息内容。
    void setOnEventCallback(int event, int funID);

    void executeEvent_OnUserExit();

    void executeEvent_OnRuntimeError(const std::string &errMsg);

    // 脚本退出
    void exit();

    // 脚本重启
    void restart();

protected:
    void removeOnEventCallback(int event);

    void removeAllOnEventCallback();

    int findEventCallbackFunID(int event);

protected:
    CONFIG_MAP mMapConfig;
    EVENT_MAP mMapEvent;

protected:
    static XMod *g_XMod;

};


#endif //LUA_XMOD_H
